package cn.iocoder.yudao.framework.qrcode.pojo;

import cn.hutool.core.util.StrUtil;
import cn.iocoder.yudao.framework.qrcode.enums.QrCodeTypeEnum;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;

import java.io.Serializable;

/**
 * <pre>
 * OOoO0OOoO0OOOooo0oOOOO0OOOOO0oooOO0ooOOO0Ooooo0OOOOo0ooooO0OOooo0Ooooo0OOOOO
 *  二维码数据基类
 * OOoO0OOoO0OOOooo0oOOOO0OOOOO0oooOO0ooOOO0Ooooo0OOOOo0ooooO0OOooo0Ooooo0OOOOO
 * </pre>
 *
 * @author 山野羡民（1032694760@qq.com）
 * @since 2025/01/04
 */
public interface QrCodeDataType extends Serializable {

    @JsonProperty("type")
    String getType();

    @JsonIgnore
    String toParameter();

    /**
     * 注意：微信小程序码场景参数只支持数字、大小写英文以及 !#$&'()*+,/:;=?@-._~，其它字符请自行编码为合法字符
     */
    @JsonIgnore
    default String toWxaScene() {
        String divider = "@";
        StringBuilder sb = new StringBuilder();
        String parameter = toParameter();
        String[] ps = parameter.split("&");
        for (String s : ps) {
            String[] s1 = s.split("=");
            if (s1.length == 2) {
                if (s1[0].equalsIgnoreCase("type")) {
                    // 微信小程序码场景参数有长度限制，故此将枚举编码转成数字节约长度
                    sb.append(QrCodeTypeEnum.codeOf(s1[0]).ordinal());
                } else {
                    sb.append(StrUtil.isEmpty(s1[1]) ? "" : s1[1]);
                }
                sb.append(divider);
            }
        }
        int idx = sb.lastIndexOf(divider);
        if (idx > 0) {
            sb.deleteCharAt(idx);
        }
        return sb.toString();
    }

}


